#define _CRT_SECURE_NO_WARNINGS 1

//#include <stdio.h>
//#include <string.h>
//#include <stdlib.h>
//
//typedef struct Stu
//{
//	int age;
//	char name[20];
//}Stu;
//
//int cmp_array(const void* p1, const void* p2)
//{
//	return *(int*)p1 - *(int*)p2;
//}
//
//int cmp_Stu_name(const void* p1, const void* p2)
//{
//	return strcmp(((Stu*)p1)->name, ((Stu*)p2)->name);
//}
//
//int cmp_Stu_age(const void* p1, const void* p2)
//{
//	return ((Stu*)p1)->age - ((Stu*)p2)->age;
//}
//
//void Print_Array(int arr[],int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}
//
//void Print_Stu(Stu* s, int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d %s",s[i].age,s[i].name);
//		printf("\n");
//	}
//}
//
//void swap(char* p1, char* p2, size_t width)
//{
//	int i = 0;
//	while (i < width)
//	{
//		char tmp;
//		tmp = *(p1 + i);
//		*(p1 + i) = *(p2 + i);
//		*(p2 + i) = tmp;
//		i++;
//	}
//}
//
//void bubble_sort(void* base, size_t num,size_t width,int (*cmp)(const void*p1,const void* p2))
//{
//	int i = 0;
//	for (i = 0; i < num - 1; i++)
//	{
//		int j = 0;
//		for (j = 0; j < num - 1 - i; j++)
//		{
//			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) < 0)
//			{
//				swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
//			}
//		}
//	}
//}
//
//int main()
//{
//	int arr[10] = { 7,5,8,9,6,4,1,2,0,3 };
//	Stu s[4] = { {18,"zhangsan"},{19,"lisi"},{25,"zhaowu"},{15,"wangliu"} };
//
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int sz2 = sizeof(s) / sizeof(s[0]);
//
//	qsort(arr, sz, sizeof(arr[0]), cmp_array);
//	Print_Array(arr, sz);
//
//	qsort(s, sz2, sizeof(s[0]), cmp_Stu_name);
//	Print_Stu(s, sz2);
//
//	qsort(s, sz2, sizeof(s[0]), cmp_Stu_age);
//	Print_Stu(s, sz2);
//
//	bubble_sort(arr, sz, sizeof(arr[0]), cmp_array);
//	Print_Array(arr, sz);
//
//	bubble_sort(s, sz2, sizeof(s[0]), cmp_Stu_name);
//	Print_Stu(s, sz2);
//
//	bubble_sort(s, sz2, sizeof(s[0]), cmp_Stu_age);
//	Print_Stu(s, sz2);
//
//	return 0;
//}

#include <stdio.h>
#include <string.h>

typedef struct Stu
{
	char name[20];
	int age;
}Stu;

int cmp_array(const void* p1,const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}

int cmp_stu_name(const void* p1, const void* p2)
{
	return strcmp(((Stu*)p1)->name, ((Stu*)p2)->name);
}

int cmp_stu_age(const void* p1, const void* p2)
{
	return ((Stu*)p1)->age - ((Stu*)p2)->age;
}

void PrintArray(int arr[], int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

void PrintStu(Stu* s, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%s %d", s[i].name, s[i].age);
		printf("\n");
	}
}

void swap(char* p1, char* p2, size_t size)
{
	int i = 0;
	while (i < size)
	{
		char tmp = *(p1 + i);
		*(p1 + i) = *(p2 + i);
		*(p2 + i) = tmp;
		i++;
	}
}

void bubble_sort(void* base, size_t num, size_t size, int (*compar) (const void* p1, const void* p2))
{
	for (int i = 0; i < num - 1; i++)
	{
		for (int j = 0; j < num - 1 - i; j++)
		{
			if (compar((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
				swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}
	}
}

int main()
{
	Stu s[3] = { {"zhangsan",18},{"lisi",19},{"sunwu",15} };
	int sz = sizeof(s) / sizeof(s[0]);

	int arr[10] = { 4,8,5,7,9,6,2,0,1,3 };
	int sz2 = sizeof(arr) / sizeof(arr[0]);

	bubble_sort(s, sz, sizeof(s[0]), cmp_stu_name);
	PrintStu(s, sz);
	printf("\n");

	bubble_sort(s, sz, sizeof(s[0]), cmp_stu_age);
	PrintStu(s, sz);
	printf("\n");

	bubble_sort(arr, sz2, sizeof(arr[0]), cmp_array);
	PrintArray(arr, sz2);
	printf("\n");

	return 0;
}
